package com.itcam.cm.model.vo.common;

import lombok.Data;

/**
 * 通用返回结果类，使用泛型以支持不同类型的数据返回
 * @param <T> 返回数据的类型
 */
@Data
public class Result<T> {

    // 返回码，用于标识请求的处理结果状态
    private Integer code;

    // 返回消息，用于描述请求处理结果的详细信息
    private String message;

    // 返回数据，具体的业务数据
    private T data;

    /**
     * 私有化构造函数，防止外部直接实例化
     */
    private Result() {
    }

    /**
     * 构建一个通用的返回结果对象
     * @param body 返回的数据
     * @param code 返回码
     * @param message 返回消息
     * @param <T> 返回数据的类型
     * @return 构建好的返回结果对象
     */
    public static <T> Result<T> build(T body, Integer code, String message) {
        Result<T> result = new Result<>();
        result.setData(body);
        result.setCode(code);
        result.setMessage(message);
        return result;
    }

    /**
     * 构建一个表示请求成功的返回结果对象
     * @param data 返回的数据
     * @param <T> 返回数据的类型
     * @return 表示成功的返回结果对象
     */
    public static <T> Result<T> ok(T data) {
        Result<T> result = new Result<>();
        result.setData(data);
        result.setCode(200);
        result.setMessage("成功");
        return result;
    }

    /**
     * 构建一个表示请求失败的返回结果对象，默认错误信息为 "失败"
     * @param <T> 返回数据的类型
     * @return 表示失败的返回结果对象
     */
    public static <T> Result<T> fail() {
        Result<T> result = new Result<>();
        result.setData(null);
        result.setCode(500);
        result.setMessage("失败");
        return result;
    }

    /**
     * 构建一个表示请求失败的返回结果对象，可自定义错误信息
     * @param errMessage 自定义的错误信息
     * @param <T> 返回数据的类型
     * @return 表示失败的返回结果对象
     */
    public static <T> Result<T> fail(String errMessage) {
        Result<T> result = new Result<>();
        result.setData(null);
        result.setCode(500);
        result.setMessage(errMessage);
        return result;
    }

    /**
     * 通过枚举构造Result对象
     * @param body 返回的数据
     * @param resultCodeEnum 结果码枚举对象，包含返回码和返回消息
     * @param <T> 返回数据的类型
     * @return 构建好的返回结果对象
     */
    public static <T> Result build(T body, ResultCodeEnum resultCodeEnum) {
        // 调用另一个 build 方法，传入 body、从 resultCodeEnum 中获取的返回码和返回消息
        return build(body, resultCodeEnum.getCode(), resultCodeEnum.getMessage());
    }


}
